﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace popoBCadd_in
{
    class generateTrueKey
    {
        /// <summary>
        /// prosedur untuk mendapatkan N byte message dari parameter message
        /// </summary>
        /// <param name="bytes">array of byte yang mau diambil</param>
        /// <param name="offset">indeks mulai message yang mau diambil</param>
        /// <param name="length">length menyatakan panjang dalam byte</param>
        /// <returns>N byte message dari parameter dimulai dari posisi ke offset</returns>
        public static byte[] getNbyteKey(byte[] bytes, int offset, int length)
        {
            byte[] result = new byte[length];
            for (int i = 0; i < length; ++i)
            {
                result[i] = bytes[offset + i];
            }
            return result;
        }

        /// <summary>
        /// swapping 8 byte
        /// </summary>
        /// <param name="dummy">8byte to swap</param>
        /// <param name="keylength">keylength menyatakan panjang kunci dalam byte</param>
        /// <returns>hasil swap dari parameter</returns>
        public static byte[] swapNbyte(byte[] dummy, int keylength)
        {
            byte[] retval = new byte[keylength];
            //SWAPPING BYTE 1-8
            //dibalik doang sih :P
            for (int i = 0; i < keylength; ++i)
            {
                retval[i] = dummy[keylength - i - 1];
            }

            return retval;
        }


        /// <summary>
        /// XOR prosedur untuk xor 2 array of 8 byte
        /// </summary>
        /// <param name="key1">key1 untuk xor</param>
        /// <param name="key2">key2 untuk xor</param>
        /// <param name="keylength">keylength menyatakan panjang kunci dalam byte</param>
        /// <returns>array of 8 byte from xor-ing key1 and key2</returns>
        public static byte[] XorNBitKey(byte[] key1, byte[] key2, int keylength)
        {
            byte[] result = new byte[keylength];
            for (int i = 0; i < keylength; ++i)
            {
                result[i] = (byte)((int)key1[i] ^ (int)key2[i]);
            }
            return result;
        }


        /// <summary>
        /// MAIN PROSEDUR untuk mengenerate kunci asli 
        /// </summary>
        /// <param name="DummyKey">string kunci masukan user</param>
        /// <returns>kunci yang dipakai untuk enkripsi</returns>
        public static byte[] getTrueKey(string DummyKey)
        {
            byte padding = 170; //bit 10101010

            if (DummyKey.Length % 2 == 1)
            {
                //kunci ganjil, harus dikasih PADDING
                DummyKey += (char)padding;
            }

            byte[] truekeyWannaBe = new byte[DummyKey.Length];
            for (int i = 0; i < DummyKey.Length; ++i)
            {
                truekeyWannaBe[i] = (byte)DummyKey[i];
            }

            //Swap dan XOR
            truekeyWannaBe = XorNBitKey(truekeyWannaBe, swapNbyte(truekeyWannaBe, truekeyWannaBe.Length), truekeyWannaBe.Length);
            return truekeyWannaBe;
        }
    }

}
